#-*- mode: perl; coding:utf-8 -*-
#Object Dump Chart Library
#  Need GraphViz
package dumplib;

use utf8;
use Encode;


#############################################################################
#      Initialize 
#############################################################################
sub Initialize {
    $Debug = 0;
    $Debug && print "DumpLIb Initialize\n";
    @ObjectDef = ();
    @ArrowDef = ();
}

#############################################################################
#      AddObject
#############################################################################
sub AddObject {
    my ($object) =@_;
    $Debug && print "AddObject $object\n";
    if ($object =~ /\{(.*)\}/) {
        my @record = split(/\,/,$1);
        my $name = shift(@record);
        my $obj = "\"$name\" [label = \"<f0> $name"; 
        my $i = 1;
        foreach $member (@record) {
            $member = &Text($member);
            $obj .= "| <f$i> $member";
            if ($member =~  /$\#/) {
                push(@ArrowDef, "\"$name\":f$i -> \"$member\":f0\n");
            }
            $i++;
        }
        $obj .= "\"];\n";
        push(@ObjectDef, $obj);
    }
}    

#############################################################################
#      Output Dot File(for GraphViz)
#############################################################################
sub OutputDot {
    my ($OutDot) = @_;
    $Debug && print "Dot $OutDot \n";
    open(OUT, ">:utf8", "$OutDot") || die "Can't open to $OutDot\n"; # FILEを開く(utf8)
    &InitializeDot();
    foreach (@ObjectDef) {
        print OUT $_;
    }
    foreach (@ArrowDef) {
        print OUT $_;
    }
    &FinalizeDot();
    close(OUT);
}

#############################################################################
#      InitializeDot
#############################################################################
sub InitializeDot {
    #header
    print OUT <<END_OF_DATA;
digraph dump_graph {
    graph [
       rankdir = "LR"
    ];
    node [
       fontsize = "12",
       shape = "record",
       style = filled,
       fillcolor = "#8FBC8F"
    ];
    edge [
    ];
    
END_OF_DATA
}

#############################################################################
#      FinalizeDot
#############################################################################
sub FinalizeDot {
    #footer
    print OUT <<END_OF_DATA;
}
END_OF_DATA
}

#############################################################################
# Translate label text for GraphViz 
#############################################################################
sub Text {
    my ($x) = @_;
    $x =~ s/"/\\"/g;                        # " -> \"
    return $x;
}

1;
